<?php
// 应用公共文件
use think\facade\Config;

class Common extends \think\Controller
{

    public $lan    = 'zh';
    public $appid  = "wx75276be810a399d7";
    public $secret = "49054d3d5a27aebcc734ee28d0693dc3";
    public $token  = [];

    # 第一步
    public function __construct(\think\App $app = null)
    {
        parent::__construct($app);
        # 开启session
        session_start();
        # 获取头信息
        $headers = getallheaders();
        # 获取语言
        $this->lan = isset($headers["Language"]) ? $headers["Language"] : 'zh';
        # 获取token并验证
        if (isset($headers["Authorization"])) {
            $this->token = $this->CheckToken($headers["Authorization"]);
        }
    }

    # 语言包
    public function Language($String)
    {
        $LanguagePack = [
            "身份验证已过期,请重新登录"    => "認証が失効したので、再登録してください",
            "非法身份登录"               => "IDを不正利用",
            "账号不存在,请核对"           => "アカウントが存在しないので、確認してください",
            "您的微信尚未绑定账户"         => "ウィーチャットはアカウントに関連付けされていません",
            "密码错误"                   => "パスワードが違います",
            "对不起,您没有权限"           => "すみませんが、利用する権限がありません",
            "昵称或者账号重复,请核对后修改" => "ニックネームまたはアカウントが重複するので、確認してから変更してください",
            "昵称或者账号重复,请核对后添加" => "ニックネームまたはアカウントが重複するので、確認してから追加してください",
            "昵称或者地址重复,请核对后修改" => "ニックネームまたは住所が重複するので、確認してから変更してください",
            "昵称或者地址重复,请核对后添加" => "ニックネームまたは住所が重複するので、確認してから追加してください",
            "添加成功"                   => "追加に成功しました",
            "修改成功"                   => "変更に成功しました",
            "删除成功"                   => "削除に成功しました",
            "请填写正确的网址"            => "正しいウェブアドレスを入力してください",
            "綁定失败,稍后再试"           => "関連付けに失敗したので、後程試してください",
            "绑定成功"                   => "関連付けに成功しました",
            "解绑成功"                   => "関連付けの解除に成功しました",
            "微信已经被绑定,请核对"        => "ウィーチャットが関連付けされたので、確認してください",
            "ip未在白名单"               => "IPがホワイトリストに記載されていません",
            "名称重复"                   => "名称が重複する",
            "线上"                      => "",
            "线下"                      => "",
        ];
        if ($this->lan != "zh" && $this->lan != "zh-CN") {
            $String = isset($LanguagePack[$String]) ? $LanguagePack[$String] : $String;
        }
        return $String;
    }

    # 加密、解密方法  $string 需要加密文本 。$operation "D"为解密，E为加密
    private function encrypt($string, $operation, $key = null)
    {
        if ($key === null) {
            $key = Config::get("app.tokenEncrypt");
        }
        $key = md5($key);
        $key_length = strlen($key);
        $string = $operation == 'D' ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
        $string_length = strlen($string);
        $rndkey = $box = array();
        $result = '';
        for ($i = 0; $i <= 255; $i++) {
            $rndkey[$i] = ord($key[$i % $key_length]);
            $box[$i] = $i;
        }
        for ($j = $i = 0; $i < 256; $i++) {
            $j = ($j + $box[$i] + $rndkey[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }
        for ($a = $j = $i = 0; $i < $string_length; $i++) {
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
        }
        if ($operation == 'D') {
            if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
                return substr($result, 8);
            } else {
                return '';
            }
        } else {
            return str_replace('=', '', base64_encode($result));
        }
    }

    # 生成Token
    protected function MakeToken($array)
    {
        // 需要的值: aid、是否为七天登录、时间戳
        $string = json_encode($array, 256);
        return $this->encrypt($string, "E") . "d2";
    }

    # 验证Token
    protected function CheckToken($String)
    {
        $str = substr($String, -2);
        if ($str === "d2") {
            $new_str = substr($String, 0, strlen($String) - 2);
            $info = $this->encrypt($new_str, "D");
            $user = json_decode($info, true);
            if (isset($user["time"]) && isset($user["aid"])) {
                $time = $user["time"];
                if ($time + 60 * 60 * 24 * 7 < time()) {
                    # token过期
                    if ($_SESSION["admin" . $user["aid"]]) {
                        unset($_SESSION["admin" . $user["aid"]]);
                    }
                    $this->Code(901, "身份验证已过期,请重新登录");
                } else {
                    $admin = db("admin")->where("aid", $user["aid"])->find();
                    if (empty($admin)) {
                        # 管理员不存在，token违法
                        $this->Code(801, "非法身份登录");
                    } else {
                        return [
                            "aid"  => $user["aid"],
                            "role" => $user["role"]
                        ];
                    }
                }
            } else {
                # token违法
                $this->Code(801, "非法身份登录");
            }
        } else {
            # token违法
            $this->Code(801, "非法身份登录");
        }
        return false;
    }

    # getCurl
    protected function GetCurl($url)
    {
        $headerArray = array("Content-type:application/json;", "Accept:application/json");
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray);
        $output = curl_exec($ch);
        curl_close($ch);
        $output = json_decode($output, true);
        return $output;
    }

    # postCurl
    protected function PostCurl($url, $data)
    {
        $data  = json_encode($data);
        $headerArray = array("Content-type:application/json;charset='utf-8'", "Accept:application/json");
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headerArray);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return json_decode($output, true);
    }

    # 输出返回值
    public function Code($code = null, $msg = false, $data = false, $options = 256)
    {
        $msg = $this->Language($msg);
        $array = [];
        $array["code"] = $code;
        (is_bool($msg) && !$msg) ? false : ($msg == 403 ? $array["msg"] = $this->Language("服务器错误,请稍后重试") : $array["msg"] = $msg);
        (is_bool($data) && !$data) ? false : $array["data"] = $data;
        echo json_encode($array, $options);
        exit();
    }
}

function uploadFile($file, $path, $name = "")
{
    $nameArr = explode(".", $file["name"]);
    $newName = ($name == "" ? time() . "." . end($nameArr) : $name . "." . end($nameArr));
    $return = move_uploaded_file($file["tmp_name"], $path . $newName);
    if ($return) {
        return $newName;
    } else {
        return false;
    }
}
